package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.Referee;
import com.school.sports.entity.RefereeAssignment;

import java.util.List;
import java.util.Map;

/**
 * 裁判管理服务接口
 */
public interface RefereeService extends IService<Referee> {

    /**
     * 分页查询裁判列表
     * @param page 分页对象
     * @param queryWrapper 查询条件
     * @return 分页结果
     */
    IPage<Referee> page(Page<Referee> page, com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<Referee> queryWrapper);

    /**
     * 根据ID查询裁判详情（包含用户信息、分配信息）
     * @param id 裁判ID
     * @return 裁判详情
     */
    Referee getRefereeWithDetails(Long id);

    /**
     * 添加裁判信息
     * @param referee 裁判信息
     * @return 添加结果
     */
    boolean addReferee(Referee referee);

    /**
     * 更新裁判信息
     * @param referee 裁判信息
     * @return 更新结果
     */
    boolean updateReferee(Referee referee);

    /**
     * 删除裁判
     * @param id 裁判ID
     * @return 删除结果
     */
    boolean deleteReferee(Long id);

    /**
     * 批量删除裁判
     * @param ids 裁判ID列表
     * @return 删除结果
     */
    boolean batchDeleteReferees(List<Long> ids);

    /**
     * 根据用户ID查询裁判信息
     * @param userId 用户ID
     * @return 裁判信息
     */
    Referee getRefereeByUserId(Long userId);

    /**
     * 根据裁判等级查询裁判列表
     * @param level 裁判等级
     * @return 裁判列表
     */
    List<Referee> getRefereesByLevel(String level);

    /**
     * 根据项目类型查询可用裁判
     * @param projectType 项目类型
     * @return 可用裁判列表
     */
    List<Referee> getAvailableRefereesByProjectType(String projectType);

    /**
     * 获取所有裁判等级
     * @return 裁判等级列表
     */
    List<String> getAllRefereeLevels();

    /**
     * 检查用户是否已经是裁判
     * @param userId 用户ID
     * @return 是否是裁判
     */
    boolean isUserReferee(Long userId);

    /**
     * 激活裁判身份
     * @param userId 用户ID
     * @param level 裁判等级
     * @param qualifiedItems 可执裁项目
     * @param experience 执裁经历
     * @return 激活结果
     */
    boolean activateReferee(Long userId, String level, String qualifiedItems, String experience);

    /**
     * 获取裁判统计信息
     * @param refereeId 裁判ID（可选）
     * @return 统计信息
     */
    Map<String, Object> getRefereeStatistics(Long refereeId);

    /**
     * 分配裁判到项目
     * @param refereeId 裁判ID
     * @param projectId 项目ID
     * @param round 轮次
     * @return 分配结果
     */
    boolean assignRefereeToProject(Long refereeId, Long projectId, Integer round);

    /**
     * 批量分配裁判
     * @param assignments 分配列表
     * @return 分配结果
     */
    boolean batchAssignReferees(List<RefereeAssignment> assignments);

    /**
     * 取消裁判分配
     * @param assignmentId 分配ID
     * @return 取消结果
     */
    boolean cancelRefereeAssignment(Long assignmentId);

    /**
     * 裁判接受分配
     * @param assignmentId 分配ID
     * @return 接受结果
     */
    boolean acceptAssignment(Long assignmentId);

    /**
     * 裁判拒绝分配
     * @param assignmentId 分配ID
     * @param reason 拒绝原因
     * @return 拒绝结果
     */
    boolean rejectAssignment(Long assignmentId, String reason);

    /**
     * 根据裁判ID查询分配列表
     * @param refereeId 裁判ID
     * @return 分配列表
     */
    List<RefereeAssignment> getAssignmentsByRefereeId(Long refereeId);

    /**
     * 根据项目ID查询分配列表
     * @param projectId 项目ID
     * @return 分配列表
     */
    List<RefereeAssignment> getAssignmentsByProjectId(Long projectId);

    /**
     * 根据状态查询分配列表
     * @param status 分配状态
     * @return 分配列表
     */
    List<RefereeAssignment> getAssignmentsByStatus(String status);

    /**
     * 获取待确认的分配列表
     * @param refereeId 裁判ID（可选）
     * @return 待确认分配列表
     */
    List<RefereeAssignment> getPendingAssignments(Long refereeId);

    /**
     * 获取裁判执裁记录
     * @param refereeId 裁判ID
     * @param projectId 项目ID（可选）
     * @return 执裁记录列表
     */
    List<Map<String, Object>> getRefereeRecords(Long refereeId, Long projectId);

    /**
     * 自动分配裁判（智能分配算法）
     * @param projectId 项目ID
     * @param round 轮次
     * @param requiredCount 需要的裁判数量
     * @return 分配结果
     */
    boolean autoAssignReferees(Long projectId, Integer round, Integer requiredCount);

    /**
     * 检查裁判分配冲突
     * @param refereeId 裁判ID
     * @param projectId 项目ID
     * @param round 轮次
     * @return 是否有冲突
     */
    boolean hasAssignmentConflict(Long refereeId, Long projectId, Integer round);

    /**
     * 获取裁判可用时间
     * @param refereeId 裁判ID
     * @return 可用时间列表
     */
    List<Map<String, Object>> getRefereeAvailableTime(Long refereeId);

    /**
     * 获取裁判工作负载
     * @param refereeId 裁判ID
     * @return 工作负载信息
     */
    Map<String, Object> getRefereeWorkload(Long refereeId);

    /**
     * 评估裁判表现
     * @param refereeId 裁判ID
     * @param projectId 项目ID
     * @param rating 评分
     * @param feedback 反馈
     * @return 评估结果
     */
    boolean evaluateRefereePerformance(Long refereeId, Long projectId, Integer rating, String feedback);

    /**
     * 获取裁判绩效报告
     * @param refereeId 裁判ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 绩效报告
     */
    Map<String, Object> getRefereePerformanceReport(Long refereeId, String startDate, String endDate);

    /**
     * 更新裁判状态
     * @param refereeId 裁判ID
     * @param status 状态
     * @return 更新结果
     */
    boolean updateRefereeStatus(Long refereeId, String status);

    /**
     * 获取项目推荐的裁判列表
     * @param projectId 项目ID
     * @param round 轮次
     * @param limit 限制数量
     * @return 推荐裁判列表
     */
    List<Referee> getRecommendedReferees(Long projectId, Integer round, Integer limit);

    /**
     * 验证裁判资质
     * @param refereeId 裁判ID
     * @param projectId 项目ID
     * @return 是否符合资质
     */
    boolean validateRefereeQualification(Long refereeId, Long projectId);

    /**
     * 获取裁判分配历史
     * @param refereeId 裁判ID
     * @return 分配历史
     */
    List<Map<String, Object>> getRefereeAssignmentHistory(Long refereeId);

    /**
     * 统计各等级裁判数量
     * @return 统计结果
     */
    Map<String, Long> getRefereeLevelStatistics();

    /**
     * 获取执裁次数最多的裁判
     * @param limit 限制数量
     * @return 裁判列表
     */
    List<Map<String, Object>> getMostActiveReferees(Integer limit);

    /**
     * 导出裁判信息
     * @param refereeIds 裁判ID列表
     * @return 导出数据
     */
    List<Map<String, Object>> exportRefereeInfo(List<Long> refereeIds);

    /**
     * 批量导入裁判信息
     * @param refereeList 裁判列表
     * @return 导入结果
     */
    Map<String, Object> batchImportReferees(List<Referee> refereeList);

    /**
     * 检查裁判信息完整性
     * @param refereeId 裁判ID
     * @return 检查结果
     */
    Map<String, Object> checkRefereeProfileCompleteness(Long refereeId);

    /**
     * 发送分配通知
     * @param assignmentId 分配ID
     * @return 发送结果
     */
    boolean sendAssignmentNotification(Long assignmentId);

    /**
     * 批量发送分配通知
     * @param assignmentIds 分配ID列表
     * @return 发送结果
     */
    boolean batchSendAssignmentNotifications(List<Long> assignmentIds);
}